package com.tfleo.mealssenger.utility;

import android.location.Location;

public class LocationTools {
	private static final int TWO_MINUTES = 1000 * 60 * 2;
	
	
	/**
	 * Determines whether one location reading is better than the current location fix.
	 *
	 * @param location The new location to be evaluated.
	 * @param currentBestLocation The current location fix to be compared with the new one.
	 */
	public static boolean isBetterLocation(Location location, Location currentBestLocation) {
		if(currentBestLocation == null) {
			return true;
		}

		//Check whether the new location fix is newer or older
		long timeDelta = location.getTime() - currentBestLocation.getTime();
	    boolean isSignificantlyNewer = timeDelta > TWO_MINUTES;
	    boolean isSignificantlyOlder = timeDelta < -TWO_MINUTES;
	    boolean isNewer = timeDelta > 0;

	    //If it's been more than two minutes since the current location, use the new Location
	    //because the user has likely moved
	    if (isSignificantlyNewer) {
	        return true;
	    //If the new location is more than two minutes older, it must be worse
	    } else if (isSignificantlyOlder) {
	        return false;
	    }

	    //Check whether the new location fix is more or less accurate
	    int accuracyDelta = (int) (location.getAccuracy() - currentBestLocation.getAccuracy());
	    boolean isLessAccurate = accuracyDelta > 0;
	    boolean isMoreAccurate = accuracyDelta < 0;
	    boolean isSignificantlyLessAccurate = accuracyDelta > 200;

	    //Check if the old and new location are from the same provider
	    boolean isFromSameProvider = isSameProvider(location.getProvider(),
	            currentBestLocation.getProvider());

	    //Determine location quality using a combination of timeliness and accuracy
	    if (isMoreAccurate) {
	        return true;
	    } else if (isNewer && !isLessAccurate) {
	        return true;
	    } else if (isNewer && !isSignificantlyLessAccurate && isFromSameProvider) {
	        return true;
	    }
	    return false;
	}

	/**
	 * Checks whether two providers are the same.
	 *
	 * @param provider1
	 * @param provider2
	 * @return true if both providers are the same
	 */
	public static boolean isSameProvider(String provider1, String provider2) {
	    if (provider1 == null) {
	      return provider2 == null;
	    }
	    return provider1.equals(provider2);
	}
}
